package com.edu.chapter07.network;

import androidx.annotation.NonNull;

import com.edu.chapter07.bean.User;
import com.google.gson.Gson;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.HttpUrl;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttpHelper {
    /*
    OkHttpClient 单例化
        使用 static final 声明 OkHttpClient 是官方推荐做法，
        因为：连接池（ConnectionPool）复用 TCP 连接，减少握手开销。
        线程池（Dispatcher）管理异步请求队列，避免重复创建线程。
        Gson 单例化
            Gson 线程安全，单例可避免重复解析配置的开销。
        MediaType 定义
        声明 JSON 请求/响应的媒体类型，确保服务器正确解析数据。
     */
    private static final OkHttpClient client = new OkHttpClient();
    private static final Gson gson = new Gson();
    private static final MediaType JSON = MediaType.get("application/json; charset=utf-8");

    public void searchGames(ResponseCallback callback) {
        // 构建URL
        // HttpUrl 是 OkHttp 的 URL 工具类，
        // 支持链式添加参数（如 .addQueryParameter("key", "value")），此处未添加参数直接构建
        HttpUrl url = HttpUrl.parse("https://jsonplaceholder.typicode.com/users/1").newBuilder().build();
        // Request 配置
        // url() 设置目标地址。
        // header() 显式声明请求头，但实际 GET 请求通常无需 Content-Type（因无请求体），此处可省略。
        // 其他常见设置：.get()（默认方法）、.post(RequestBody) 等
        Request request = new Request.Builder().url(url).header("Content-Type", "application/json").build();

        // 异步请求
        // 非阻塞，后台线程执行请求
        // 异步请求 (enqueue)
        // OkHttp 的异步方法，回调在后台线程执行（非主线程！），需手动切线程更新 UI。
        client.newCall(request).enqueue(new Callback() {
            // 响应解析
            //   response.body().charStream() 使用字符流直接解析 JSON，
            //   比 string() 更省内存（避免大字符串内存溢出）
            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) {
                User res = null;
                if (response.body() != null)
                    res = gson.fromJson(response.body().charStream(), User.class);
                callback.onSuccess(res);
                response.close();
            }

            // 错误处理
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
            }
        });
    }

    public interface ResponseCallback {
        void onSuccess(User response);
    }
}